#pragma once
#include<vector>
#include<iostream>

using namespace std;
namespace bit
{
template<size_t N>//N表示需要N个比特位
class bit_set
{
public:

    bit_set()
    {
        _bits.resize(N/32+1,0);//开辟N/32+1个整形空间
    }

    void set(size_t x)
    {
        size_t i=x/32;//求x在第几个整形中
        size_t j=x%32;//求x在i这个整形中的第几位

        _bits[i]|=(1<<j);//将第i个整形中的第j位置为1
    }
    void reset(size_t x)
    {
        size_t i=x/32;//求x在第几个整形中
        size_t j=x%32;//求x在i这个整形中的第几位

        _bits[i]&=~(1<<j);//将第i个整形中的第j位置为0
    }
    bool test(size_t x)
    {
        size_t i=x/32;//求x在第几个整形中
        size_t j=x%32;//求x在i这个整形中的第几位
        return static_cast<bool>(_bits[i]&(1<<j)); //判断将第i个整形中的第j位置的真假情况
    }
private:
    vector<int> _bits;
};
template<size_t N>//N表示需要N个比特位
class twobit_set
{
public:

    twobit_set()
    {
       
    }

    void set(size_t x)
    {
        //00->01
        //01->10
        //10不变（出现两次以上）
        if(_bs1.test(x)==false&&_bs2.test(x)==false)//00
        {
            _bs2.set(x);
        }
        else if(_bs1.test(x)==false&&_bs2.test(x)==true)//01
        {
            _bs1.set(x);
            _bs2.reset(x);
        }
    }
    
    void PrintOnce()
    {
        for(size_t i=0;i<N;i++)
        {
            if(_bs1.test(i)==false&&_bs2.test(i)==true)//01
            {
                cout<<i<<endl;
            }
        }
    }
    
    void reset(size_t x)
    {
        
    }
    bool test(size_t x)
    {
       
    }
private:
    bit_set<N> _bs1;
    bit_set<N> _bs2;
};
}


